home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 2001 May / SGI Freeware 2001 May - Disc 1.iso / dist / fw_kdelibs.idb / usr / freeware / kde / include / kurl.h.z / kurl.h
C/C++ Source or Header  |  1999-01-26  |  12KB  |  363 lines

  1. /* This file is part of the KDE libraries
  2.     Copyright (C) 1997 Steffen Hansen (stefh@dit.ou.dk)
  3.  
  4.     This library is free software; you can redistribute it and/or
  5.     modify it under the terms of the GNU Library General Public
  6.     License as published by the Free Software Foundation; either
  7.     version 2 of the License, or (at your option) any later version.
  8.  
  9.     This library is distributed in the hope that it will be useful,
  10.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12.     Library General Public License for more details.
  13.  
  14.     You should have received a copy of the GNU Library General Public License
  15.     along with this library; see the file COPYING.LIB.  If not, write to
  16.     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  17.     Boston, MA 02111-1307, USA.
  18. */
  19. #ifndef KURL_H
  20. #define KURL_H
  21.  
  22. // -*-C++-*-
  23. // KURL header
  24. //
  25.  
  26. #ifdef HAVE_CONFIG_H
  27. #include <config.h>
  28. #endif
  29.  
  30. #include <qstring.h>
  31. #include <qstrlist.h>
  32.  
  33. /** 
  34. * A class for URL processing.
  35. *
  36. * The KURL class deals with uniform resource locators in a 
  37. * protocol independent way. It works on file:-type URLs
  38. * much like @ref QDir does on normal directories; but KURL extends 
  39. * the directory operations to work on general URLs. In fact, the 
  40. * part of KURL that only deals with syntax doesn't care about 
  41. * the protocol at all, so feel free to use it to format any 
  42. * URL-like string. 
  43. * NOTE: KURL doesn't support URL's that don't look like files 
  44. * (for example mailto:someone@somewhere). [If URL's like this were OK, 
  45. * there would be no reason for isMalformed() since any string with a 
  46. * ":" would be a valid URL.  Comments please.] 
  47. *
  48. * First version by Torben Weis, redesigned by Steffen Hansen (stefh@mip.ou.dk),
  49. * maintained by Torben Weis (weis@kde.org). Endcoding/Decoding done by
  50. * Stephan Kulow (coolo@kde.org).
  51. *
  52. * @author Torben Weis (weis@kde.org)
  53. *
  54. * @version $Id: kurl.h,v 1.17 1998/06/07 12:31:26 kulow Exp $
  55. * @short A class for URL processing.
  56. */
  57.  
  58. class KURL
  59. public:
  60.  
  61.     /** 
  62.      * Construct a KURL object.
  63.      */
  64.     KURL();
  65.     
  66.     /** 
  67.      * Construct a KURL object from _url. 
  68.      *
  69.      * A KURL object is always constructed, but if you plan to use it, 
  70.      * you should check it with isMalformed().
  71.      *
  72.      * if the parameter is an absolute filename, it adds a file: prefix 
  73.      * and encodes the path.
  74.      */
  75.     KURL( const char* _url);
  76.  
  77.     ~KURL();
  78.  
  79.     /** 
  80.      * Construct a KURL object from its components. 
  81.      */
  82.     KURL( const char* _protocol, const char* _host, 
  83.       const char* _path, const char* _ref);
  84.     
  85.     /**
  86.      * Constructs a URL.
  87.      *
  88.      * The second argument may be a relative URL, like '/home/weis/test.txt'.
  89.      * If for example the first parameter is 'http://uni-frankfurt/pub/incoming' 
  90.      * then the result will be 'http://uni-frankfurt/home/weis/test.txt'. 
  91.      *
  92.      * Of course the second argument may be a complete URL, too.
  93.      */
  94.     KURL( KURL & _base_url, const char* _rel_url );
  95.     
  96.     /** 
  97.      * Returns true if the URL is not a valid URL. This is only syntax-checking;
  98.      * whether the resource to which the URL points exists is not checked.
  99.      *       
  100.      * NOTE: Syntax checking is only done when constructing a KURL from a string. 
  101.      */
  102.     bool isMalformed() const { return malformed; }
  103.     
  104.     /**
  105.      * Escapes some reserved characters within URLs (e.g. '#', '%').
  106.      *
  107.      * Some characters in filenames or directory names make troubles
  108.      * For example '#' or '%' makes problem, if they are interpreted
  109.      * and not ment to be interpreted. This why we must encode them.
  110.      * This functions encodes the given URL and returns a reference
  111.      * to the result for convidence.
  112.      */
  113.     static void encodeURL( QString& url );
  114.     
  115.     /**
  116.      * Decodes escaped characters within URLs.
  117.      *
  118.      * This function looks for '%' within the URL and replaces this character 
  119.      * with hexcode of the next two characters. If the next characters are not 
  120.      * hex chararcters, 0 will be used and the character will be skipped.
  121.      */
  122.     static void decodeURL( QString& url );
  123.     
  124.     /** 
  125.      * Returns the URL as a QString.
  126.      */
  127.     QString url() const;
  128.     
  129.     /** 
  130.      * The function returns the protocolname up to, but not including the ":".
  131.      */
  132.     const char* protocol() const;
  133.     
  134.     /** 
  135.      * This function returns the host. If there is no host (i.e.
  136.      * the URL refers to a local file) this function returns "".
  137.      */
  138.     const char* host() const;
  139.     
  140.     /** 
  141.      * This function returns the path-part of the URL.
  142.      *
  143.      * For example, path() on "tar://ftp.foo.org/bar/stuff.tar.gz#tex/doc.tex" 
  144.      * returns "/bar/stuff.tar.gz".
  145.      */
  146.     const char* path() const;
  147.     
  148.     /**
  149.      * If we parse for example ftp://weis@localhost then we dont have a path.
  150.      * The URL means: enter the home directory of user weis, while
  151.      * ftp://weis@localhost/ means, login as user weis and enter the
  152.      * root directory. KURL returns "/" as path in both cases. This function
  153.      * lets you distinguish both URLs. It returns true in the first case.
  154.      *
  155.      * @see #bNoPath
  156.      */
  157.     bool hasPath() const { return !bNoPath; }
  158.     
  159.     /** 
  160.      * This function returns the reference. 
  161.      *
  162.      * If the URL is "http://www.nowhere/path/file.html#toc", this function 
  163.      * will return "toc". If there is no reference it returns "".
  164.      * If we have some subprotocol in the URL like in 
  165.      * file:/tmp/kde.tgz#tar:/kfm.rpm#rpm:/doc/index.html#section
  166.      * then only the last reference is going to be returned, in this case
  167.      * "section". A URL like
  168.      * file:/tmp/kde.tgz#tar:/kfm.rpm#rpm:/doc/index.html
  169.      * would return "" since there is no reference. The stuff behind
  170.      * the '#' is a subprotocol!
  171.      */
  172.     const char* reference() const;
  173.     
  174.     /**
  175.      * This function returns the user name or an empty string if
  176.      * no user has been specified.
  177.      */
  178.     const char* user();
  179.     
  180.     /**
  181.      * The password.
  182.      *
  183.      * @return the password, or an empty string if no password was specified.
  184.      */
  185.     const char* passwd();
  186.     
  187.     /**
  188.      * The port number.
  189.      *
  190.      * @return the port number, or 0 if none was specified.
  191.      */
  192.     unsigned int port() const;
  193.     
  194.     /**
  195.      * Returns the directory only.
  196.      *
  197.      * If for example the URL is "file:/tmp/weis/file.html", then this call
  198.      * will return "/tmp/weis/". If you pass "file:/tmp/weis/" to this
  199.      * function, you will get "/tmp/weis/", because you already passed a directory.
  200.      * Turning the '_trailing' flag off, causes the trailing '/' to be ignored.
  201.      * "file:/tmp/weis/file.html" will result in "/tmp/weis/", too, but
  202.      * "file:/tmp/weis/" will lead to "/tmp/". As you see, this is
  203.      * a smart method to get the parent directory of a file/directory.
  204.      *
  205.      * This function is supplied for convenience only.
  206.      */
  207.     const char * directory( bool _trailing = TRUE );
  208.     
  209.     /**
  210.      * Returns the URL with the directory only.
  211.      *
  212.      * If for example the URL is "file:/tmp/weis/file.html", then this call
  213.      * will return "file:/tmp/weis/". For more details look at 'directory(...)'
  214.      */
  215.     const char * directoryURL( bool _trailing = TRUE );
  216.     
  217.     /**
  218.      * @return TRUE if the URL has a sub protocol. For example file:/tmp/kde.tgz#tar:/kfm/main.cpp
  219.      *         is a URL with subprotocol. Use this function to check wether some URL really
  220.      *         references a complete file on your local hard disk and not some special data
  221.      *         inside the file, like the example shows.
  222.      */
  223.     bool hasSubProtocol();
  224.  
  225.     /**
  226.      * If the URL has no subprotocol, parentURL behaves like a call to @ref #url.
  227.      * Otherwise the part of the URL left to the last subprotocol is returned.
  228.      * For example file:/tmp/kde.tgz#tar:/kfm.rpm#rpm:/doc/index.html#section will return
  229.      * file:/tmp/kde.tgz#tar:/kfm.rpm. As you can see, the last subprotocol is stripped.
  230.      * If the original URL is for example file:/httpd/index.html#section
  231.      * then exact this string is going to be returned.
  232.      */
  233.     QString parentURL();
  234.     /**
  235.      * This call returnes the other part of the URL, the part that is stripped by @ref #parentURL.
  236.      * It returns always the right most subprotocol. If there is no subprotocol, the call
  237.      * to this function returns an empty string. For example a URL 
  238.      * file:/tmp/kde.tgz#tar:/kfm.rpm#rpm:/doc/index.html#section
  239.      * would return rpm:/doc/index.html#section.
  240.      */
  241.     QString childURL();
  242.     /**
  243.      * This function behaves like @ref #childURL, but if there is no subprotocol,
  244.      * this function returns the same @ref #url returns instead of an empty string.
  245.      */
  246.     QString nestedURL();
  247.  
  248.     /**
  249.      * Parse a string.
  250.      */
  251.     void parse( const char *_url );
  252.     
  253.     /** 
  254.      * Sets the protocol to newProto. Useful for example if an app hits
  255.      * "file:/tmp/interesting.zip", then it might do setProtocol( "zip").
  256.      */ 
  257.     void setProtocol( const char* newProto) ;
  258.     
  259.     /**
  260.      * Set the password.
  261.      */
  262.     void setPassword( const char *password );
  263.     
  264.     /** 
  265.      * Set reference. 
  266.      *
  267.      * A reference may be removed with setRef( ""). The function returns false 
  268.      * if it could not make a reference (if there were no path to reference 
  269.      * from) and true on succes.
  270.      */
  271.     bool setReference( const char* _ref);
  272.  
  273.     /** 
  274.      * Changes directory by descending into the given directory. 
  275.      * If dir starts with a "/" the 
  276.      * current URL will be "protocol://host/dir" otherwise dir will 
  277.      * be appended to the path.
  278.      * If 'zapRef' is true, the reference will be deleted.
  279.      */   
  280.     bool cd( const char* _dir, bool zapRef = true);
  281.     
  282.     /** 
  283.      * Go to parent dir. If zapRef is true, the reference is removed, 
  284.      * otherwise it stays, but normally no one would want that. 
  285.      */
  286.     bool cdUp( bool zapRef = true);
  287.     
  288.     /**
  289.      * Returns the filename or directory name of the URL.
  290.      *
  291.      * If 'file:/home/weis/test.txt' is the URL, the result will be 'test.txt'
  292.      * If the URL us 'tar:/home/weis/test.tgz#foo/myfile' and isReference is TRUE,
  293.      * the function will return 'myfile'
  294.      */
  295.     const char *filename();
  296.     
  297.     /**
  298.      * Makes a copy of a URL.
  299.      */
  300.     KURL &operator=( const KURL &);
  301.     
  302.     /** 
  303.      * Initialize the URL with the given string.
  304.      * '_url' must be a valid URL.
  305.      */
  306.     KURL &operator=( const char* _url );
  307.     
  308.     /** 
  309.      * Compare URL's.
  310.      *
  311.      * @return true if the URLs are equal, false otherwise.
  312.      */
  313.     bool operator==( const KURL &_url) const ;
  314.  
  315.  
  316.     /**
  317.       * Checks, if the URL refers to a usual file, that
  318.       * can be openend with usual methods.
  319.       *
  320.       * Note: It doesn't check, if the file exist
  321.       *
  322.       * @return true, if the URL is a file, that can be opened
  323.       **/
  324.     bool isLocalFile();
  325.  
  326. protected:
  327.     void cleanPath();
  328.     
  329.     bool malformed;
  330.     /**
  331.      * If we parse for example ftp://weis@localhost then we dont have a path.
  332.      * The URL means: enter the home directory of user weis, while
  333.      * ftp://weis@localhost/ means, login as user weis and enter the
  334.      * root directory. KURL returns "/" as path in both cases. This variable
  335.      * is used to distinguish both URLs. It is true in the first case.
  336.      *
  337.      * @see #hasPath
  338.      */
  339.     bool bNoPath;
  340.     int port_number; 
  341.  
  342.     QString protocol_part;
  343.     QString host_part;
  344.     QString path_part;
  345.     QString path_part_decoded;
  346.     QString ref_part;
  347.     // This variable is only valid after calling 'directory'.
  348.     QString dir_part;
  349.     QString user_part;
  350.     QString passwd_part;
  351.     
  352. private:
  353.     void detach();
  354. };
  355.  
  356.  
  357.  
  358. #endif
  359.  
  360.  
  361.